package Ubicacion;

import java.util.ArrayList;

import Excepciones.FueraDeLimites;
import MapaStuff.Hectarea;

public class ZonaCircundante {
	
	private ArrayList<Direccion> direccionesHorizontales;
	private ArrayList<Direccion> direccionesVerticales;
	
	public ZonaCircundante(){
		direccionesHorizontales=new ArrayList<Direccion>();
		direccionesVerticales=new ArrayList<Direccion>();
		direccionesHorizontales.add(new Este());
		direccionesHorizontales.add(new Oeste());
		direccionesVerticales.add(new Norte());
		direccionesVerticales.add(new Sur());
	}
	
	public ArrayList<Hectarea> darHectareasAlRededor(Hectarea hectareaOrigen,int radio){
		ArrayList<Hectarea> hectareasAlCostado=new ArrayList<Hectarea>();
		ArrayList<Hectarea> hectareasDeArribaYAbajo=new ArrayList<Hectarea>();
		for(Direccion direccion: this.direccionesHorizontales){
			this.darHectareas(hectareaOrigen,hectareaOrigen, direccion, radio, hectareasAlCostado);
		}
		for(Direccion direccion: this.direccionesVerticales){
			for(Hectarea hectarea:hectareasAlCostado){
				this.darHectareas(hectareaOrigen,hectarea, direccion, radio, hectareasDeArribaYAbajo);
			}
			this.darHectareas(hectareaOrigen,hectareaOrigen,direccion, radio, hectareasDeArribaYAbajo);
		}
		ArrayList<Hectarea> hectareasTotales= hectareasAlCostado;
		hectareasTotales.addAll(hectareasDeArribaYAbajo);
		return hectareasTotales;
	}
		
	private void darHectareas(Hectarea origen,Hectarea hectareaDePartida,Direccion direccion,int radio,ArrayList<Hectarea> hectareas){
		Hectarea hectareaSiguiente=hectareaDePartida;
		for(int i=1;i<=radio;i++){
			try{
				hectareaSiguiente=direccion.hectareaSiguiente(hectareaSiguiente);
				this.agregarACollectionHectarea(origen, hectareaSiguiente, radio, hectareas);
			}catch(FueraDeLimites e){}
		}
	}
	
	private void agregarACollectionHectarea(Hectarea origen,Hectarea hectarea,int radio,ArrayList<Hectarea> hectareas){
		if(origen.distancia(hectarea)<=radio){
			hectareas.add(hectarea);
			return;
		}
		return;
	}
	
}
